package leetcode.editor.cn.q1_300.q250;
//你在和朋友一起玩 猜数字（Bulls and Cows）游戏，该游戏规则如下： 
//
// 写出一个秘密数字，并请朋友猜这个数字是多少。朋友每猜测一次，你就会给他一个包含下述信息的提示： 
//
// 
// 猜测数字中有多少位属于数字和确切位置都猜对了（称为 "Bulls"，公牛）， 
// 有多少位属于数字猜对了但是位置不对（称为 "Cows"，奶牛）。也就是说，这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。 
// 
//
// 给你一个秘密数字 secret 和朋友猜测的数字 guess ，请你返回对朋友这次猜测的提示。 
//
// 提示的格式为 "xAyB" ，x 是公牛个数， y 是奶牛个数，A 表示公牛，B 表示奶牛。 
//
// 请注意秘密数字和朋友猜测的数字都可能含有重复数字。 
//
// 
//
// 示例 1： 
//
// 
//输入：secret = "1807", guess = "7810"
//输出："1A3B"
//解释：数字和位置都对（公牛）用 '|' 连接，数字猜对位置不对（奶牛）的采用斜体加粗标识。
//"1807"
//  |
//"7810" 
//
// 示例 2： 
//
// 
//输入：secret = "1123", guess = "0111"
//输出："1A1B"
//解释：数字和位置都对（公牛）用 '|' 连接，数字猜对位置不对（奶牛）的采用斜体加粗标识。
//"1123"        "1123"
//  |      or     |
//"0111"        "0111"
//注意，两个不匹配的 1 中，只有一个会算作奶牛（数字猜对位置不对）。通过重新排列非公牛数字，其中仅有一个 1 可以成为公牛数字。 
//
// 
//
// 提示： 
//
// 
// 1 <= secret.length, guess.length <= 1000 
// secret.length == guess.length 
// secret 和 guess 仅由数字组成 
// 
//
// 👍 295 👎 0

/**
 * 这题意有有点绕了
 * 公牛：数字和位置都对的 A
 * 奶牛：数字对，位置错的 B
 * <p>
 * 这样的话，先遍历判断 bull，并且统计非公牛字符出现的次数
 * 然后通过统计的字数就可以得到 cow
 * <p>
 * 执行耗时:5 ms,击败了66.01% 的Java用户
 * 内存消耗:40.4 MB,击败了55.66% 的Java用户
 */
public class Q299_BullsAndCows {
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String getHint(String secret, String guess) {
            // 公牛：数字和位置都对的
            int bull = 0;
            // 奶牛：数字对，位置错的
            int cow = 0;

            // secret 统计
            int[] sCharNum = new int[26];
            // guess 统计
            int[] gCharNum = new int[26];
            for (int i = 0; i < guess.length(); i++) {
                if (secret.charAt(i) == guess.charAt(i)) {
                    bull++;
                } else {
                    sCharNum[secret.charAt(i) - '0']++;
                    gCharNum[guess.charAt(i) - '0']++;
                }
            }

            for (int i = 0; i < 26; i++) {
                cow += Math.min(sCharNum[i], gCharNum[i]);
            }

            return bull + "A" + cow + "B";
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)


    public static void main(String[] args) {
        Solution solution = new Q299_BullsAndCows().new Solution();
        // TO TEST
        System.out.println(solution.getHint("1807", "7810"));
        System.out.println(solution.getHint("1123", "0111"));
    }
}